<?php

namespace SisGG\FinalBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use SisGG\FinalBundle\Entity\Provincia;
use SisGG\FinalBundle\Entity\Proveedor;
use SisGG\FinalBundle\Entity\Direccion;
use SisGG\FinalBundle\Entity\Cuit;
use SisGG\FinalBundle\Entity\CategoriaProductoVenta;

/**
 * @author martin
 * @ORM\Entity
 */
class Empresa implements \Serializable {

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=25, unique=true)
     * @Assert\NotBlank
     */
    private $nombre;

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank
     */
    private $descripcion;

    /**
     * @ORM\Column(type="string",length=11)
     */
    private $cuit;

    /**
     * @ORM\OneToOne(targetEntity="Direccion")
     * @ORM\JoinColumn(name="direccion_id", referencedColumnName="id")
     */
    private $direccion;

    /**
     * @ORM\OneToOne(targetEntity="Telefono")
     * @ORM\JoinColumn(name="telefonofijo_id", referencedColumnName="id")
     */
    private $telefonofijo;

    /**
     * @ORM\OneToOne(targetEntity="Telefono")
     * @ORM\JoinColumn(name="telefonocelular_id", referencedColumnName="id")
     */
    private $telefonocelular;

    /**
     * @ORM\OneToMany(targetEntity="Cliente",mappedBy="empresa")
     */
    private $clientes;
    
    /**
     * @ORM\OneToMany(targetEntity="CategoriaProductoVenta", mappedBy="empresa")
     */
    private $categoriasPV;
     /**
     * @ORM\OneToMany(targetEntity="CategoriaProductoProduccion", mappedBy="empresa")
     */
    private $categoriasPP;
    
    /**
     * @ORM\OneToMany(targetEntity="Proveedor", mappedBy="empresa")
     */
    private $proveedores;

    /**
     * @ORM\OneToMany(targetEntity="Provincia", mappedBy="empresa")
     */
    private $provincias;

    /**
     * @return string
     */
    public function serialize() {
        return serialize($this->id);
    }

    /**
     * @param string $data
     */
    public function unserialize($data) {
        $this->id = unserialize($data);
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     * @return Empresa
     */
    public function setNombre($nombre) {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string 
     */
    public function getNombre() {
        return $this->nombre;
    }

    /**
     * Set descripcion
     *
     * @param string $descripcion
     * @return Empresa
     */
    public function setDescripcion($descripcion) {
        $this->descripcion = $descripcion;

        return $this;
    }

    /**
     * Get descripcion
     *
     * @return string 
     */
    public function getDescripcion() {
        return $this->descripcion;
    }

    /**
     * Set cuit
     *
     * @param string $cuit
     * @return Empresa
     */
    public function setCuit($cuit) {
        $this->cuit = $cuit;

        return $this;
    }

    /**
     * Get cuit
     *
     * @return string 
     */
    public function getCuit() {
        return $this->cuit;
    }

    /**
     * Set direccion
     *
     * @param SisGG\FinalBundle\Entity\Direccion $direccion
     * @return Empresa
     */
    public function setDireccion(\SisGG\FinalBundle\Entity\Direccion $direccion = null) {
        $this->direccion = $direccion;

        return $this;
    }

    /**
     * Get direccion
     *
     * @return SisGG\FinalBundle\Entity\Direccion 
     */
    public function getDireccion() {
        return $this->direccion;
    }

    /**
     * Set telefonofijo
     *
     * @param SisGG\FinalBundle\Entity\Telefono $telefonofijo
     * @return Empresa
     */
    public function setTelefonofijo(\SisGG\FinalBundle\Entity\Telefono $telefonofijo = null) {
        $this->telefonofijo = $telefonofijo;

        return $this;
    }

    /**
     * Get telefonofijo
     *
     * @return SisGG\FinalBundle\Entity\Telefono 
     */
    public function getTelefonofijo() {
        return $this->telefonofijo;
    }

    /**
     * Set telefonocelular
     *
     * @param SisGG\FinalBundle\Entity\Telefono $telefonocelular
     * @return Empresa
     */
    public function setTelefonocelular(\SisGG\FinalBundle\Entity\Telefono $telefonocelular = null) {
        $this->telefonocelular = $telefonocelular;

        return $this;
    }

    /**
     * Get telefonocelular
     *
     * @return SisGG\FinalBundle\Entity\Telefono 
     */
    public function getTelefonocelular() {
        return $this->telefonocelular;
    }

    /**
     * Constructor
     */
    public function __construct() {
        $this->clientes = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add clientes
     *
     * @param SisGG\FinalBundle\Entity\Cliente $clientes
     * @return Empresa
     */
    public function addCliente(\SisGG\FinalBundle\Entity\Cliente $clientes) {
        $this->clientes[] = $clientes;

        return $this;
    }

    /**
     * Remove clientes
     *
     * @param SisGG\FinalBundle\Entity\Cliente $clientes
     */
    public function removeCliente(\SisGG\FinalBundle\Entity\Cliente $clientes) {
        $this->clientes->removeElement($clientes);
    }

    /**
     * Get clientes
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getClientes() {
        return $this->clientes;
    }

    //SergioINICIO
    //ProveedorINICIO
    public function addProveedor(Proveedor $prov, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $cuit = $em->getRepository('SisGGFinalBundle:Cuit')->findOneBy(array('numero' => $prov->getCuit()->getNumero()));
        if ($cuit == null) {
            $rSoc = $em->getRepository('SisGGFinalBundle:Proveedor')->findOneBy(array('razonSocial' => $prov->getRazonSocial()));
            //$rSoc = $em->getRepository('SisGGFinalBundle:Empresa')->find(1);
            if ($rSoc == null) {
                $prov->setActivo(true);
                $this->guardar($prov, $c);
                $this->guardar($prov->getCuit(), $c);
                $this->guardar($prov->getDireccion(), $c);
                $this->guardar($prov->getTel1(), $c);
                $this->guardar($prov->getTel2(), $c);
                $this->addProveedore($prov);
                $prov->setEmpresa($this);
                $em->flush();
                return null;
            } else {
                return "El proveedor " . $prov->getRazonSocial() . " CUIT: " . $prov->getCuit()->__toString() . " ya se encuentra registrado.";
            }
        } else {
            return "El proveedor " . $prov->getRazonSocial() . " CUIT: " . $prov->getCuit()->__toString() . " ya se encuentra registrado.";
        }
    }
    
    public function modificarProveedor(Proveedor $prov, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $query = $em->createQuery('SELECT p from SisGGFinalBundle:Proveedor p WHERE ((p.razonSocial = :rs OR p.cuit = :cuit) and p.id <> :id and p.activo=true)');
        $query->setParameters(array(
            ':rs' => $prov->getRazonSocial(),
            ':cuit' => $prov->getCuit(),
            ':id' => $prov->getId(),
        ));   
        if ($query->getResult()==null){
            $em->flush();
        }else {
            return "El proveedor " . $prov->getRazonSocial() . " CUIT: " . $prov->getCuit()->__toString() . " ya se encuentra registrado.";
        }
        
    }
    
    public function eliminarProveedor(Proveedor $prov, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        if ($prov->getActivo()) {
            $prov->setActivo(false); 
            $em->flush();
            return null;
        } else {
            return "Este proveedor ya se encuentra eliminado.";
        }
    }

    //ProveedorFIN
    //CategoriaPVINICIO
    
    public function altaCategoriaPV(CategoriaProductoVenta $categoria, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $o=$em->getRepository('SisGGFinalBundle:CategoriaProductoVenta')->findOneBy(array('nombre'=>$categoria->getNombre()));
        if ($o==null){
           if ($categoria->getPadre()!=null){
               if ($categoria->getPadre()->getProductoVenta()->isEmpty()){
                   $this->guardar($categoria, $c);
                   $categoria->setEmpresa($this);
                   $this->addCategoriasPV($categoria);
                   $em->flush();
               }else{
                   return "La categoria ".$categoria->getNombre()." no puede ser registrada, ya que la categoria ".$categoria->getPadre()->getNombre()." posee productos. Seleecione otra que no contega.";
               }
           } else{
               $this->guardar($categoria, $c);
                $categoria->setEmpresa($this);
                $this->addCategoriasPV($categoria);
                $em->flush();
           }
        }else{
            return "La categoria ".$categoria->getNombre()." ya se encuentra registrada.";
        }
        
    }
    
    public function modificarCategoriaPV (CategoriaProductoVenta $categoria, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $o=$em->getRepository('SisGGFinalBundle:CategoriaProductoVenta')->findOneBy(array('nombre'=>$categoria->getNombre(), 'id'=>$categoria->getId()));
        if ($o==null){
           if ($categoria->getPadre()!=null){
               if ($categoria->getPadre()->getProductoVenta()->isEmpty()){     
                   $em->flush();
               }else{
                   return "La categoria ".$categoria->getNombre()." no puede ser registrada, ya que la categoria ".$categoria->getPadre()->getNombre()." posee productos. Seleecione otra que no contega.";
               }
           } else{
                $em->flush();
           }
        }else{
            return "La categoria ".$categoria->getNombre()." ya se encuentra registrada.";
        }
    }
    
    
    
    //CategoriaPVFIN
    //ProvinciaINICIO

    public function agregarProvincia(Provincia $prov, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $nomProv = $em->getRepository('SisGGFinalBundle:Provincia')->findOneBy(array('nombre' => $prov->getNombre()));
        if ($nomProv == null) {
            $this->guardar($prov, $c);
            $this->addProvincia($prov);
            $prov->setEmpresa($this);
            $em->flush();
        } else {
            return "La Provincia " . $prov->getNombre() . " ya se encuentra registrada.";
        }
    }

    public function modificarProvincia(Provincia $prov, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $nomProv = $em->getRepository('SisGGFinalBundle:Provincia')->findOneBy(array('nombre' => $prov->getNombre()));
        if ($nomProv != null) {
            if ($nomProv->getId() == $prov->getId()) {
                $em->flush();
            } else {
                return "La Provincia " . $prov->getNombre() . " ya se encuentra registrada.";
            }
        } else {
            $em->flush();
        }
    }

    public function eliminarProvincia(Provincia $prov, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        if ($prov->getCiudad()->isEmpty()) {
            $this->eliminar($prov, $c);
            $this->removeProvincia($prov);
            return null;
        } else {
            return "No se puede eliminar la Provincia " . $prov->getNombre() . " puesto que contiene ciudades registradas. Eliminelas primero.";
        }
    }

    //ProvinciaFIN
    //CiudadINICIO

    public function agregarCiudad(Ciudad $ciudad, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
//        $nomCiu = $em->getRepository('SisGGFinalBundle:Ciudad')->findOneBy(array('nombre' => $ciudad->getNombre()));
        $query = $em->createQuery('SELECT DISTINCT c from SisGGFinalBundle:Ciudad c JOIN c.provincia p WHERE (c.nombre = :nombre OR c.codigoPostal = :cp) and p.id = :idP');
        $query->setParameters(array(
            ':nombre' => $ciudad->getNombre(),
            ':cp' => $ciudad->getCodigoPostal(),
            ':idP' => $ciudad->getProvincia()->getId(),
        ));
        $nomCiu = $query->getResult();
        if ($nomCiu == null) {
            $this->guardar($ciudad, $c);
            $ciudad->getProvincia()->addCiudad($ciudad);
            $ciudad->setProvincia($ciudad->getProvincia());
            $em->flush();
        } else {
            return "La Ciudad " . $ciudad->getNombre() . " CP: " . $ciudad->getCodigoPostal() . " ya se encuentra registrada.";
        }
    }

    public function modificarCiudad(Ciudad $ciudad, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $query = $em->createQuery('SELECT DISTINCT c from SisGGFinalBundle:Ciudad c WHERE  c.codigoPostal = :cp and c.id <> :id');
        $query->setParameters(array(
            ':cp' => $ciudad->getCodigoPostal(),
            ':id' => $ciudad->getId()
        ));
        if ($query->getResult() == null) {

            $query2 = $em->createQuery('SELECT DISTINCT c from SisGGFinalBundle:Ciudad c JOIN c.provincia p WHERE (c.nombre = :nombre OR c.codigoPostal = :cp) and p.id = :idP and c.id <> :id');
            $query2->setParameters(array(
                ':nombre' => $ciudad->getNombre(),
                ':cp' => $ciudad->getCodigoPostal(),
                ':idP' => $ciudad->getProvincia()->getId(),
                ':id' => $ciudad->getId(),
            ));
            $nomCiu = $query2->getResult();
            if ($nomCiu != null) {
                return "La Ciudad " . $ciudad->getNombre() . " ya se encuentra registrada.";
            } else {
                $em->flush();
            }
        } else {
            return "La Ciudad " . $ciudad->getNombre() . " o el CP: ".$ciudad->getCodigoPostal()." ya se encuentra registrada.";
        }
    }

    public function eliminarCiudad(Ciudad $ciudad, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
            $query = $em->createQuery('SELECT DISTINCT d from SisGGFinalBundle:Direccion d JOIN d.ciudad c WHERE  c.id = :id');
            $query->setParameters(array(
                ':id' => $ciudad->getId(),
            ));
            $nomCiu = $query->getResult();
            if ($nomCiu != null) {
                return "La Ciudad " . $ciudad->getNombre() . " no puede ser eliminada puesto que está asignada a una dirección.";
            } else {
                $this->eliminar($ciudad, $c);
            }
   
    }
    //CiudadFIN
    //ABMFIN
    private function guardar($o, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $em->persist($o);
    }

    private function eliminar($o, \Symfony\Bundle\FrameworkBundle\Controller\Controller $c) {
        $em = $c->getDoctrine()->getEntityManager();
        $em->remove($o);
        $em->flush();
    }

    //ABMFIN
    //SergioFIN

    /**
     * Add proveedores
     *
     * @param SisGG\FinalBundle\Entity\Proveedor $proveedores
     * @return Empresa
     */
    public function addProveedore(\SisGG\FinalBundle\Entity\Proveedor $proveedores) {
        $this->proveedores[] = $proveedores;

        return $this;
    }

    /**
     * Remove proveedores
     *
     * @param SisGG\FinalBundle\Entity\Proveedor $proveedores
     */
    public function removeProveedore(\SisGG\FinalBundle\Entity\Proveedor $proveedores) {
        $this->proveedores->removeElement($proveedores);
    }

    /**
     * Get proveedores
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getProveedores() {
        return $this->proveedores;
    }

    /**
     * Add provincias
     *
     * @param SisGG\FinalBundle\Entity\Provincia $provincias
     * @return Empresa
     */
    public function addProvincia(\SisGG\FinalBundle\Entity\Provincia $provincias) {
        $this->provincias[] = $provincias;

        return $this;
    }

    /**
     * Remove provincias
     *
     * @param SisGG\FinalBundle\Entity\Provincia $provincias
     */
    public function removeProvincia(\SisGG\FinalBundle\Entity\Provincia $provincias) {
        $this->provincias->removeElement($provincias);
    }

    /**
     * Get provincias
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getProvincias() {
        return $this->provincias;
    }


    /**
     * Add categoriasPV
     *
     * @param SisGG\FinalBundle\Entity\CategoriaProductoVenta $categoriasPV
     * @return Empresa
     */
    public function addCategoriasPV(\SisGG\FinalBundle\Entity\CategoriaProductoVenta $categoriasPV)
    {
        $this->categoriasPV[] = $categoriasPV;
    
        return $this;
    }

    /**
     * Remove categoriasPV
     *
     * @param SisGG\FinalBundle\Entity\CategoriaProductoVenta $categoriasPV
     */
    public function removeCategoriasPV(\SisGG\FinalBundle\Entity\CategoriaProductoVenta $categoriasPV)
    {
        $this->categoriasPV->removeElement($categoriasPV);
    }

    /**
     * Get categoriasPV
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getCategoriasPV()
    {
        return $this->categoriasPV;
    }

    /**
     * Add categoriasPP
     *
     * @param SisGG\FinalBundle\Entity\CategoriaProductoProduccion $categoriasPP
     * @return Empresa
     */
    public function addCategoriasPP(\SisGG\FinalBundle\Entity\CategoriaProductoProduccion $categoriasPP)
    {
        $this->categoriasPP[] = $categoriasPP;
    
        return $this;
    }

    /**
     * Remove categoriasPP
     *
     * @param SisGG\FinalBundle\Entity\CategoriaProductoProduccion $categoriasPP
     */
    public function removeCategoriasPP(\SisGG\FinalBundle\Entity\CategoriaProductoProduccion $categoriasPP)
    {
        $this->categoriasPP->removeElement($categoriasPP);
    }

    /**
     * Get categoriasPP
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getCategoriasPP()
    {
        return $this->categoriasPP;
    }
}